raise関数は、この関数を呼び出したプロセスにシグナルを送ります。
#include <signal.h>
int raise(int signum);
signumは送るシグナルを指定します。
戻り値として、正常に送れた場合は0を、送れなかった場合は0以外を返します。
第1引数のsignumに指定できる値は、signal.hファイルに定義されています。また、UNIX系OSの場合は、kill -lコマンドで表示できます。
次の例題プログラムは0又は、SIGINTシグナル(CtrlキーとCキーを同時に押下することにより発生)を3回発行すると終了します。
プログラム 例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
/* ユーザ定義関数の宣言 */
void SetSignal(int SignalName);
void SigHandler(int SignalName);
void Input(void);
int main(void)
{
SetSignal(SIGINT);
Input();
return 0;
}
void Input(void)
{
int in_data;
printf('0又はCtl+Cを3回入力すると終了します\n');
while(1) {
printf('整数を入力してください ==> ');
scanf('%d', &in_data);
if (in_data == 0) {
raise(SIGINT);
}
}
return;
}
/* シグナルの設定 */
void SetSignal(int p_signame)
{
if (signal(p_signame, SigHandler) == SIG_ERR) {
/* シグナル設定エラー */
printf('シグナルの設定が出来ませんでした。終了します\n');
exit(1);
}
return;
}
/* シグナル受信/処理 */
void SigHandler(int p_signame)
{
static int sig_cnt = 0;
++sig_cnt;
if (sig_cnt <= 2) {
putchar(0x07); /* ベルを鳴らす */
fflush(stdout);
}
else {
printf('\n%d回目の割り込みです。終了します\n', sig_cnt);
exit(0);
}
/* シグナルの再設定 */
SetSignal(p_signame);
return;
}
例の実行結果
Ctl+Cを1回入力しています。
$ ./raise.exe 0又はCtl+Cを3回入力すると終了します 整数を入力してください ==> 1 整数を入力してください ==> 2 整数を入力してください ==> 0 整数を入力してください ==> 4 整数を入力してください ==> 5 整数を入力してください ==> 6 整数を入力してください ==> 7 整数を入力してください ==> 8 整数を入力してください ==> 0 3回目の割り込みです。終了します $